// 给定一个非空字符串 s 和一个包含非空单词的列表 wordDict，判定 s 是否可以被空格拆分为一个或多个在字典中出现的单词。

// 说明：

// 拆分时可以重复使用字典中的单词。
// 你可以假设字典中没有重复的单词。

// 来源：力扣（LeetCode）
// 链接：https://leetcode-cn.com/problems/word-break
// 著作权归领扣网络所有。商业转载请联系官方授权，非商业转载请注明出处。

// 完全背包问题，动态规划
// 看了题解

// 执行用时：
// 16 ms
// , 在所有 C++ 提交中击败了
// 58.08%
// 的用户
// 内存消耗：
// 14.4 MB
// , 在所有 C++ 提交中击败了
// 6.40%
// 的用户

#include<bits/stdc++.h>
#include<string>
#include<vector>
#include<unordered_set>
#include<set>
#include<queue>
using namespace std;

class Solution {
public:
    bool wordBreak(string s, vector<string>& wordDict) {
        unordered_set<string> hash;
        for(int i=0;i<wordDict.size();i++){
            hash.insert(wordDict[i]);
        }
        vector<int> dp(s.size()+1,0);
        dp[0] = 1;
        for(int i=0;i<=s.size();i++){
            for(int j=0;j<i;j++){
                string temp = s.substr(j,i-j);
                if(hash.count(temp) && dp[j] ==1){
                    dp[i] = 1;
                }
            }
        }
        if(dp[s.size()] == 1){
            return true;
        }
        return false;
    }
};